package com.pdh.dao;

import com.pdh.bean.Express;
import com.pdh.bean.LazyBoardInfo;
import com.pdh.exception.DuplicateCodeException;
import com.pdh.exception.DuplicateNumberException;
import com.pdh.exception.UnHandleException;

import java.util.List;
import java.util.Map;

/**
 * @Author: 彭德华
 * @Date 2021-08-29 22:19
 */
public interface BaseExpressDao {
    /**
     * 用于查询数据库中的全部快递(总数+新增)，带取件快递(总数+新增)
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     */
    Map<String, Integer> consoleExpress();

    /**
     * 用于查询所有快递
     * @param paging 是否分页标记 true/false 分页/查询所有
     * @param offset sql语句起始索引
     * @param limit 页查询的数量
     * @return 快递的集合
     */
    List<Express> findAll(boolean paging,int offset,int limit);

    /**
     * 根据快递单号查询快递信息
     * @param number 单号
     * @return 查询的快递信息，单号不存在时候返回null
     */
    Express findByNumber(String number);

    /**
     * 根据快递取件码查询快递信息
     * @param code 取件码
     * @return 查询的快递信息，取件码不存在时候返回null
     */
    Express findByCode(String code);

    /**
     * 根据用户手机号码，查询他所有的快递信息
     * @param user_phone 用户手机号码
     * @return 查询的快递信息列表，不存在时候返回null
     */
    List<Express> findByUserPhone(String user_phone);

    /**
     * 根据用户手机号码，和状态码，查询他的指定状态的所有快递信息
     * @param user_phone 用户手机号码
     * @param status 快件状态码
     * @return 查询的快递信息列表，不存在时候返回null
     */
    List<Express> findByUserPhoneAndStatus(String user_phone,int status);

    /**
     * 根据用户手机号码，查询录入的所有快递记录
     * @param courier_phone 录入人手机号码
     * @return 查询的快递信息列表，不存在时候返回null
     */
    List<Express> findByCourierPhone(String courier_phone);

    /**
     * 快递的录入
     * @param express 录入的快递对象
     * @return 录入结果 true/false 成功/失败
     */
    boolean insert(Express express) throws DuplicateCodeException, DuplicateNumberException;

    /**
     * 快递的修改
     * @param id 要修改的快递id
     * @param newExpress 新的快递对象(number,company,username,userPhone)
     * @return 修改结果 true/false 成功/失败
     */
    boolean update(int id,Express newExpress) throws DuplicateNumberException;

    /**
     * 更改快递的状态：0 审核中,1 待取件,2 已取件,3 已取消,4 已删除,5 异常
     * @param code 要修改的取件码
     * @return true/false 成功/失败
     */
    boolean updateStatus(String code,int status);

    /**
     * 根据id删除单个快递信息,并不是正在的删除，而是修改转台
     * @param id 要删除的快递id
     * @return true/false 成功/失败
     */
    boolean delete(int id);

    /**
     *
     * 于查询总懒人排行榜 包括总榜、年榜、月榜 lazyBoardCount,lazyBoardYear,lazyBoardMonth
     * @param paging
     * @param offset
     * @param limit
     * @return list
     */
    Map<String,List<LazyBoardInfo>> lazyBoardInfo(boolean paging, int offset, int limit) throws UnHandleException;
}
